package com.base.dao;

import java.io.Serializable;
import java.util.List;
import java.util.Map;

public interface IBaseDao<T,PK extends Serializable> {
	
	/**********************基础类操作*********************/
	
	/**
	 * 保存一个对象
	 * @param o
	 * @return
	 */	
	public Serializable save(T o);
	
	/**
	 * 删除一个对象
	 * @param o
	 */
	public void delete(T o);	
	
	/**
	 * 按id删除一个对象
	 * @param o
	 */
	public void delete(PK id);		
	
	/**
	 * 修改一个对象
	 * @param o
	 */
	public void update(T o);
	
	/**
	 * 保存或更新一个对象
	 * @param o
	 */
	public void saveOrUpdate(T o);	
	
	
	/**********************单条记录查询类*********************/	
	
	/**
	 * 根据给定的hql语句获取数据库记录
	 * @param hql
	 * @return
	 */	
	public T get(String hql);
	
	/**
	 * 根据给定的Model类型及id获取一条数据库记录
	 * @param hql
	 * @return
	 */		
	public T get(Class<T> c,Serializable id);
	
	/**
	 * 根据给定的ID获取数据库一条记录
	 * @param hql
	 * @return
	 */		
	public T get(PK id);
	
	/**
	 * 根据hql获取数据记录，hql在拼写是需要用？的方式设置参数，条件参数放置在params数组中,params类型为object
	 * @param hql
	 * @param params
	 * @return
	 */
	public T get(String hql,Object[] params);
	
	/**
	 * 根据hql获取数据记录，条件参数放置在params数组中，params为Map类型，params中存储键值对，键为model的属性名称，value为属性对应的取值，推荐此用法
	 * @param hql
	 * @param params
	 * @return
	 */
	public T get(String hql,Map<String,Object> params);	

	
	/**********************多条记录查询类*********************/	
	
	/**
	 * 获取所有对象
	 * @return
	 */
	public List<T> getAll();
	
	/**
	 * 根据查询语句查询多个对象
	 * @@param hql 查询语句
	 * @return
	 */
	public List<T> getAll(String hql);
	
	/**
	 * 根据查询语句查询多个对象并分页
	 * @param hql 查询语句
	 * @param page，页码
	 * @param rows，每页记录数
	 * @return
	 */
	public List<T> getAll(String hql,int page,int rows);
	
	/**
	 * 查询多个对象，带参数Map
	 * @param hql 查询语句
	 * @param params
	 * @return
	 */
	public List<T> getAll(String hql,Map<String,Object> params);
	
	/**
	 * 分页，传参
	 * @param hql 查询语句
	 * @param params
	 * @param page 页码
	 * @param rows 每页记录数
	 * @return
	 */
	public List<T> getAll(String hql,Map<String,Object> params,int page,int rows);	
	
	/**
	 * 获取记录总数
	 * @param hql
	 * @return
	 */
	public int count(String hql);
	
	/**
	 * 获取记录总数,，但参数
	 * @param hql
	 * @param params
	 * @return
	 */
	public int count(String hql,Map<String,Object> params);	
	
		
}
